﻿using UnityEngine;
using PnFramework;
using PnFramework.Unity;

namespace UnitySmallTheater
{
    public class Player : MonoBehaviour
    {
        private Vector3 mTarget;
        private int mRank = 1;
        private int mProfession;
        private int mCurExperience;

        public void Move(Vector3 target) => mTarget = target;

        private void Start()
        {
            //我们可以通过事件管理器 注册相同名字的事件 来监听方向输入的触发 这里我们 填上事件名和需要注册的事件
            //在使用事件和委托的过程中记住有加必有减 我们一定要在销毁对象时 进行事件注销哦
            //到这里 相信大家对事件系统有了一些认识 弹幕管理器中的事件道理也是一样的 就留给大家当做作业啦 
            //最后提一嘴 大家可以自己尝试写一下基于枚举 基于类型的事件版本 观察他们的优缺点哦！记得交作业 么么

            LiveMsgMgr.Instance.ConnectLive(51238);
            EventMgr.Instance.Register<DirInputEvent>(InputMgr.DirInput, OnMove);
        }
        private void Update()
        {
            if ((transform.position - mTarget).sqrMagnitude < 0.01f) return;
            transform.localPosition = Vector3.MoveTowards(transform.position, mTarget, Time.deltaTime * 3);
        }

        private float mAccDelta = 0.6f;
        private float mDeAccDelta = 0.9f;
        private float mMoveSpeed = 8;

        private Vector2 mMoveVel;

        private void OnMove(DirInputEvent e)
        {
            if (e.hor != 0)
            {
                mMoveVel.x = Mathf.Clamp(mMoveVel.x + e.hor * mAccDelta, -mMoveSpeed, mMoveSpeed);
            }
            else
            {
                mMoveVel.x = Mathf.MoveTowards(mMoveVel.x, 0, mDeAccDelta);
            }
            if (e.ver != 0)
            {
                mMoveVel.y = Mathf.Clamp(mMoveVel.y + e.ver * mAccDelta, -mMoveSpeed, mMoveSpeed);
            }
            else
            {
                mMoveVel.y = Mathf.MoveTowards(mMoveVel.y, 0, mDeAccDelta);
            }
            transform.Translate(mMoveVel * Time.deltaTime);
        }
        private void OnDestroy()
        {
            EventMgr.Instance.UnRegister<DirInputEvent>(InputMgr.DirInput, OnMove);
        }
    }
}